package com.mytool.util;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 类型转换工具类
 */
public class TypeMappingUtil {
    private static final Map<String, String> SQL_TO_JAVA_TYPE_MAP = new HashMap<>();
    
    static {
        // 整数类型
        SQL_TO_JAVA_TYPE_MAP.put("tinyint", "Integer");
        SQL_TO_JAVA_TYPE_MAP.put("smallint", "Integer");
        SQL_TO_JAVA_TYPE_MAP.put("mediumint", "Integer");
        SQL_TO_JAVA_TYPE_MAP.put("int", "Integer");
        SQL_TO_JAVA_TYPE_MAP.put("integer", "Integer");
        SQL_TO_JAVA_TYPE_MAP.put("bigint", "Long");
        
        // 浮点类型
        SQL_TO_JAVA_TYPE_MAP.put("float", "Float");
        SQL_TO_JAVA_TYPE_MAP.put("double", "Double");
        SQL_TO_JAVA_TYPE_MAP.put("decimal", "BigDecimal");
        SQL_TO_JAVA_TYPE_MAP.put("numeric", "BigDecimal");
        
        // 字符串类型
        SQL_TO_JAVA_TYPE_MAP.put("char", "String");
        SQL_TO_JAVA_TYPE_MAP.put("varchar", "String");
        SQL_TO_JAVA_TYPE_MAP.put("tinytext", "String");
        SQL_TO_JAVA_TYPE_MAP.put("text", "String");
        SQL_TO_JAVA_TYPE_MAP.put("mediumtext", "String");
        SQL_TO_JAVA_TYPE_MAP.put("longtext", "String");
        
        // 日期类型
        SQL_TO_JAVA_TYPE_MAP.put("date", "Date");
        SQL_TO_JAVA_TYPE_MAP.put("time", "Date");
        SQL_TO_JAVA_TYPE_MAP.put("datetime", "Date");
        SQL_TO_JAVA_TYPE_MAP.put("timestamp", "Date");
        
        // 布尔类型
        SQL_TO_JAVA_TYPE_MAP.put("bit", "Boolean");
        SQL_TO_JAVA_TYPE_MAP.put("boolean", "Boolean");
    }
    
    /**
     * 将MySQL字段类型转换为Java类型
     * 
     * @param sqlType MySQL字段类型，如varchar(64)
     * @return Java类型
     */
    public static String convertToJavaType(String sqlType) {
        if (sqlType == null || sqlType.isEmpty()) {
            return "Object";
        }
        
        // 提取基本类型（不包括长度等信息）
        Pattern pattern = Pattern.compile("^([a-zA-Z]+)");
        Matcher matcher = pattern.matcher(sqlType.toLowerCase());
        
        if (matcher.find()) {
            String baseType = matcher.group(1);
            return SQL_TO_JAVA_TYPE_MAP.getOrDefault(baseType, "Object");
        }
        
        return "Object";
    }
    
    /**
     * 将数据库字段名转换为Java属性名（驼峰命名）
     * 
     * @param columnName 数据库字段名，如user_name
     * @return Java属性名，如userName
     */
    public static String convertToCamelCase(String columnName) {
        if (columnName == null || columnName.isEmpty()) {
            return "";
        }
        
        StringBuilder result = new StringBuilder();
        boolean nextUpper = false;
        
        for (int i = 0; i < columnName.length(); i++) {
            char currentChar = columnName.charAt(i);
            
            if (currentChar == '_') {
                nextUpper = true;
            } else {
                if (nextUpper) {
                    result.append(Character.toUpperCase(currentChar));
                    nextUpper = false;
                } else {
                    result.append(Character.toLowerCase(currentChar));
                }
            }
        }
        
        return result.toString();
    }
} 